	#include <avr/io.h>
	#include <avr/signal.h>
	#include <util/delay.h>
	#include <avr/eeprom.h>

	
	signed char k=0,per=0,sec=0;
	signed int vremy=0;	//1"vremy"==1
	//   65535=1092=18
	
	unsigned char komanda11,komanda12,komanda13,komanda14,komanda15,komanda16,komanda17,komanda18;
	
	unsigned char kom11pov,kom12pov,kom13pov,kom14pov,kom15pov,kom16pov,kom17pov,kom18pov;
	unsigned char kom11pon,kom12pon,kom13pon,kom14pon,kom15pon,kom16pon,kom17pon,kom18pon;
	unsigned char kom11tay,kom12tay,kom13tay,kom14tay,kom15tay,kom16tay,kom17tay,kom18tay;
	
	
	
	
	
	void morg_kras(int dl_kr, int oc_kr)//  -
	{
	TCCR2A = 0b00100011;
	TCCR2B = 0b00000010;
	OCR2B = oc_kr;
	_delay_ms(dl_kr);
	TCCR2A = 0b00000000;
	TCCR2B = 0b00000000;
	}
	
	void morg_zelen(int dl_zel, int oc_zel)//  -
	{
	TCCR2A = 0b10000011;
	TCCR2B = 0b00000010;
	OCR2A = oc_zel;
	_delay_ms(dl_zel);
	TCCR2A = 0b00000000;
	TCCR2B = 0b00000000;
	}
	





void povushaem (void)
	{
	per++;
		if (per==6)
		{
			morg_kras(2000,250);
			per=5;
		}
		else
		{
		switch(per)
			{
			case 1:
				PORTC =0b00000010;
				morg_kras(100,200);
				break;
			case 2:
				PORTC =0b00000100;
				morg_kras(100,200);
				break;
			case 3:
				PORTC =0b00001000;
				morg_kras(100,200);
				break;
			case 4:
				PORTC =0b00010000;
				morg_kras(100,200);
				break;
			case 5:
				PORTC =0b00000000;
				morg_kras(100,200);
				break;
			}// switch  
		}
	}
	

	
	void ponihaem (void)
	{
	per--;
		if (per==-1)
		{
			morg_zelen(2000,250);
			per=0;
		}
		else
		{
		switch(per)
			{
			case 0:
				PORTC =0b00000001;
				morg_zelen(100,200);
				break;
			case 1:
				PORTC =0b00000010;
				morg_zelen(100,200);
				break;
			case 2:
				PORTC =0b00000100;
				morg_zelen(100,200);
				break;
			case 3:
				PORTC =0b00001000;
				morg_zelen(100,200);
				break;
			case 4:
				PORTC =0b00010000;
				morg_zelen(100,200);
				break;
			}// switch  
		}
	}
	
	
	
	
	
	
	

	
////////////////////////////////////////////////////////////////////////////////////	
			void zaeeprompov (void)//   EEPROM
			{
			eeprom_write_byte(0x00,komanda11);// 
			eeprom_write_byte(0x01,komanda12);// 
			eeprom_write_byte(0x02,komanda13);// 
			eeprom_write_byte(0x03,komanda14);// 
			eeprom_write_byte(0x04,komanda15);// 
			eeprom_write_byte(0x05,komanda16);// 
			eeprom_write_byte(0x06,komanda17);// 
			eeprom_write_byte(0x07,komanda18);// 
			morg_kras(5000,25);
			}
			
			////////////////////////////////////////////////////////////////////////////////////	
			void zaeeprompon (void)//   EEPROM
			{
			eeprom_write_byte(0x08,komanda11);// 
			eeprom_write_byte(0x09,komanda12);// 
			eeprom_write_byte(0x0A,komanda13);// 
			eeprom_write_byte(0x0B,komanda14);// 
			eeprom_write_byte(0x0C,komanda15);// 
			eeprom_write_byte(0x0D,komanda16);// 
			eeprom_write_byte(0x0E,komanda17);// 
			eeprom_write_byte(0x0F,komanda18);// 
			morg_zelen(5000,25);
			}
			
			////////////////////////////////////////////////////////////////////////////////////	
			void zaeepromtay (void)//   EEPROM
			{
			eeprom_write_byte(0x10,komanda11);// 
			morg_kras(500,25);
			eeprom_write_byte(0x11,komanda12);// 
			morg_zelen(500,25);
			eeprom_write_byte(0x12,komanda13);// 
			morg_kras(500,25);
			eeprom_write_byte(0x13,komanda14);// 
			morg_zelen(500,25);
			eeprom_write_byte(0x14,komanda15);// 
			morg_kras(500,25);
			eeprom_write_byte(0x15,komanda16);// 
			morg_zelen(500,25);
			eeprom_write_byte(0x16,komanda17);// 
			morg_kras(500,25);
			eeprom_write_byte(0x17,komanda18);// 
			}
			
			
			
///////////////////////////////////////////////////////////////////////////////			
	void ports(void)//  -
	{	
	DDRB = 0b00001000;	//PB1-SB1-("-"/1);
						//PB3-H1- ;
	
	DDRC = 0b00011111;	//PC0-PC4-;
	
	DDRD = 0b00001000;	//PD7-SB2-("+"/15);
						//PD1-SB3-(/);
						//PD3-H2- 

	PORTB |= _BV(PB1);//    PB1
	PORTD |= _BV(PD1);//    PD1
	PORTD |= _BV(PD7);//    PD7
	}	
	
	
   
   
   
   
   //////////////////////////////////////////////////////////////////////////////
	//      ICP1
	SIGNAL(SIG_INPUT_CAPTURE1)//  ,  SIGNAL
	{
		if (~PINB & (_BV(PB0)))//  PB0  "0"
		{
			k++;
			
			switch(k)
		{
			case 18:
				if (ICR1>15)	komanda11 = 1;
				else	komanda11 = 0;
				break;
			case 19:
				if (ICR1>15)	komanda12 = 1;
				else	komanda12 = 0;
				break;
			case 20:
				if (ICR1>15)	komanda13 = 1;
				else	komanda13 = 0;
				break;
			case 21:
				if (ICR1>15)	komanda14 = 1;
				else	komanda14 = 0;
				break;
			case 22:
				if (ICR1>15)	komanda15 = 1;
				else	komanda15 = 0;
				break;
			case 23:
				if (ICR1>15)	komanda16 = 1;
				else	komanda16 = 0;
				break;
			case 24:
				if (ICR1>15)	komanda17 = 1;
				else	komanda17 = 0;
				break;
			case 25:
				if (ICR1>15)	komanda18 = 1;
				else	komanda18 = 0;
				break;
		}// switch  

			TCCR1B =0b11000011;//    
			TCNT1=0;

		}

		else//  PB0  "1"
		{
			// 
			TCCR2A = 0b00000000;
			TCCR2B = 0b00000000;
				
			if (k==34)
			{

				k=0;
			{
			kom11pov = eeprom_read_byte(0x00);
			kom12pov = eeprom_read_byte(0x01);
			kom13pov = eeprom_read_byte(0x02);
			kom14pov = eeprom_read_byte(0x03);
			kom15pov = eeprom_read_byte(0x04);
			kom16pov = eeprom_read_byte(0x05);
			kom17pov = eeprom_read_byte(0x06);
			kom18pov = eeprom_read_byte(0x07);
			
			kom11pon = eeprom_read_byte(0x08);
			kom12pon = eeprom_read_byte(0x09);
			kom13pon = eeprom_read_byte(0x0A);
			kom14pon = eeprom_read_byte(0x0B);
			kom15pon = eeprom_read_byte(0x0C);
			kom16pon = eeprom_read_byte(0x0D);
			kom17pon = eeprom_read_byte(0x0E);
			kom18pon = eeprom_read_byte(0x0F);
			
			kom11tay = eeprom_read_byte(0x10);
			kom12tay = eeprom_read_byte(0x11);
			kom13tay = eeprom_read_byte(0x12);
			kom14tay = eeprom_read_byte(0x13);
			kom15tay = eeprom_read_byte(0x14);
			kom16tay = eeprom_read_byte(0x15);
			kom17tay = eeprom_read_byte(0x16);
			kom18tay = eeprom_read_byte(0x17);
			}
				PORTD |= _BV(PD3);
				PORTB |= _BV(PB3);
				_delay_ms(100);
				PORTD &= ~_BV(PD3);
				PORTB &= ~_BV(PB3);
				

				
if (komanda11==kom11pov && komanda12==kom12pov && komanda13==kom13pov && komanda14==kom14pov && komanda15==kom15pov && komanda16==kom16pov && komanda17==kom17pov && komanda18==kom18pov)
		povushaem();
				
	if (komanda11==kom11pon && komanda12==kom12pon && komanda13==kom13pon && komanda14==kom14pon && komanda15==kom15pon && komanda16==kom16pon && komanda17==kom17pon && komanda18==kom18pon)				
		ponihaem();
				
	if (komanda11==kom11tay && komanda12==kom12tay && komanda13==kom13tay && komanda14==kom14tay && komanda15==kom15tay && komanda16==kom16tay && komanda17==kom17tay && komanda18==kom18tay)
				{
				morg_kras(4000,250);
				vremy=vremy+900;// 15 
				
				// 
				TCCR0B = 0b00000101;
				TIMSK0 = 0b00000010;
				OCR0A = 250;
				}
			}
			
			TCCR1B =0b10000011;//    
			TCNT1=0;

		}//.   . 
	
	
	
	}//  

	//        /0
	SIGNAL(SIG_OUTPUT_COMPARE0A)
	{
	sec++;
		if (sec==4)
		{
		vremy--;
		sec=0;
		}
		
		if (vremy<=0)
		{
			TCCR0B = 0b00000000;//  /0
			PORTC = 0b00000001;
			per=0;
		}
	TCNT0=0;
	}
		




//////////////////////////////////////
//////////////////////////////////////	
   
   void main (void)	//   
   {
   _delay_ms(1000);
	ports();
	PORTC = 0b00000001;// 

	TCCR1B =0b10000011;//  64, 1  65
	TIMSK1 =0b00100000;//      ICP1
	SREG = (1<<7);//   
	TCNT1=0;
	TCNT0=0;
	
	TCCR0A = 0b00000000;// ,    
mesto_1:
		while(1)
		{
			if (~PIND & (_BV(PD7)))//  "+"/15 
			{
			_delay_ms(500);
				if (~PIND & (_BV(PD1)))//  / 
				{
				_delay_ms(500);
					if (~PINB & (_BV(PB1)))//  "-"/1 
					zaeepromtay();
					else
					zaeeprompov();
				}
				else
				povushaem();
			}
			
			
			if (~PINB & (_BV(PB1)))//  "-"/1 
			{
			_delay_ms(500);
				if (~PIND & (_BV(PD1)))//  / 
				zaeeprompon();
				else
				ponihaem();
			}
			
			
			if (~PIND & (_BV(PD1)))//  / 
			{

				_delay_ms(200);

				for(;;)
				{
				TCCR2A = 0b00100011;//   
				TCCR2B = 0b00000010;
				OCR2B = 5;
				
					if (PORTC == 0b00000001)
					{
					// 
					TCCR2A = 0b00000000;
					TCCR2B = 0b00000000;
					
					//   .
					PORTC = 0b00000000;
					per = 5;
					_delay_ms(500);
					goto mesto_1;
					}
					
					if (~PIND & (_BV(PD7)))//  "+"/15 
					{
					vremy=vremy+900;
					morg_kras(500,250);
					}
					
					if (~PINB & (_BV(PB1)))//  "-"/1 
					{
					vremy=vremy+60;
					morg_zelen(500,250);
					}
					
					if (~PIND & (_BV(PD1)))//  / 
					{
					// 
					TCCR0B = 0b00000101;
					TIMSK0 = 0b00000010;
					OCR0A = 250;
					
					//  
					TCCR2A = 0b00000000;
					TCCR2B = 0b00000000;
					_delay_ms(500);
					
					goto mesto_1;
					}
					
					if (TCNT1==75)
					{
					TCNT1=0;
					k=0;
					}
				
				}///.   
			}
			
			
			
			if (TCNT1==75)
			{
			TCNT1=0;
			k=0;
			}
			

			
			//   
			if (PORTC == 0b00000001)
			{
			TCCR2A = 0b10000011;
			TCCR2B = 0b00000010;
			OCR2A = 5;
			}
			
		}
	}      //    
